#ifndef __MPU9250_REG_H
#define __MPU9250_REG_H

/* ---- MPU6500 Reg In MPU9250 ---------------------------------------------- */

#define MPU6500_I2C_ADDR            ((UINT8)0x68)   /* 7b'1101000 */
#define MPU6500_DeviceID            ((UINT8)0x71)   /* In MPU9250 */

#define MPU6500_SELF_TEST_XG        ((UINT8)0x00)
#define MPU6500_SELF_TEST_YG        ((UINT8)0x01)
#define MPU6500_SELF_TEST_ZG        ((UINT8)0x02)
#define MPU6500_SELF_TEST_XA        ((UINT8)0x0D)
#define MPU6500_SELF_TEST_YA        ((UINT8)0x0E)
#define MPU6500_SELF_TEST_ZA        ((UINT8)0x0F)
#define MPU6500_XG_OFFSET_H         ((UINT8)0x13)
#define MPU6500_XG_OFFSET_L         ((UINT8)0x14)
#define MPU6500_YG_OFFSET_H         ((UINT8)0x15)
#define MPU6500_YG_OFFSET_L         ((UINT8)0x16)
#define MPU6500_ZG_OFFSET_H         ((UINT8)0x17)
#define MPU6500_ZG_OFFSET_L         ((UINT8)0x18)
#define MPU6500_SMPLRT_DIV          ((UINT8)0x19)
#define MPU6500_CONFIG              ((UINT8)0x1A)
#define MPU6500_GYRO_CONFIG         ((UINT8)0x1B)
#define MPU6500_ACCEL_CONFIG        ((UINT8)0x1C)
#define MPU6500_ACCEL_CONFIG_2      ((UINT8)0x1D)
#define MPU6500_LP_ACCEL_ODR        ((UINT8)0x1E)
#define MPU6500_MOT_THR             ((UINT8)0x1F)
#define MPU6500_FIFO_EN             ((UINT8)0x23)
#define MPU6500_I2C_MST_CTRL        ((UINT8)0x24)
#define MPU6500_I2C_SLV0_ADDR       ((UINT8)0x25)
#define MPU6500_I2C_SLV0_REG        ((UINT8)0x26)
#define MPU6500_I2C_SLV0_CTRL       ((UINT8)0x27)
#define MPU6500_I2C_SLV1_ADDR       ((UINT8)0x28)
#define MPU6500_I2C_SLV1_REG        ((UINT8)0x29)
#define MPU6500_I2C_SLV1_CTRL       ((UINT8)0x2A)
#define MPU6500_I2C_SLV2_ADDR       ((UINT8)0x2B)
#define MPU6500_I2C_SLV2_REG        ((UINT8)0x2C)
#define MPU6500_I2C_SLV2_CTRL       ((UINT8)0x2D)
#define MPU6500_I2C_SLV3_ADDR       ((UINT8)0x2E)
#define MPU6500_I2C_SLV3_REG        ((UINT8)0x2F)
#define MPU6500_I2C_SLV3_CTRL       ((UINT8)0x30)
#define MPU6500_I2C_SLV4_ADDR       ((UINT8)0x31)
#define MPU6500_I2C_SLV4_REG        ((UINT8)0x32)
#define MPU6500_I2C_SLV4_DO         ((UINT8)0x33)
#define MPU6500_I2C_SLV4_CTRL       ((UINT8)0x34)
#define MPU6500_I2C_SLV4_DI         ((UINT8)0x35)
#define MPU6500_I2C_MST_STATUS      ((UINT8)0x36)
#define MPU6500_INT_PIN_CFG         ((UINT8)0x37)
#define MPU6500_INT_ENABLE          ((UINT8)0x38)
#define MPU6500_INT_STATUS          ((UINT8)0x3A)
#define MPU6500_ACCEL_XOUT_H        ((UINT8)0x3B)
#define MPU6500_ACCEL_XOUT_L        ((UINT8)0x3C)
#define MPU6500_ACCEL_YOUT_H        ((UINT8)0x3D)
#define MPU6500_ACCEL_YOUT_L        ((UINT8)0x3E)
#define MPU6500_ACCEL_ZOUT_H        ((UINT8)0x3F)
#define MPU6500_ACCEL_ZOUT_L        ((UINT8)0x40)
#define MPU6500_TEMP_OUT_H          ((UINT8)0x41)
#define MPU6500_TEMP_OUT_L          ((UINT8)0x42)
#define MPU6500_GYRO_XOUT_H         ((UINT8)0x43)
#define MPU6500_GYRO_XOUT_L         ((UINT8)0x44)
#define MPU6500_GYRO_YOUT_H         ((UINT8)0x45)
#define MPU6500_GYRO_YOUT_L         ((UINT8)0x46)
#define MPU6500_GYRO_ZOUT_H         ((UINT8)0x47)
#define MPU6500_GYRO_ZOUT_L         ((UINT8)0x48)
#define MPU6500_EXT_SENS_DATA_00    ((UINT8)0x49)
#define MPU6500_EXT_SENS_DATA_01    ((UINT8)0x4A)
#define MPU6500_EXT_SENS_DATA_02    ((UINT8)0x4B)
#define MPU6500_EXT_SENS_DATA_03    ((UINT8)0x4C)
#define MPU6500_EXT_SENS_DATA_04    ((UINT8)0x4D)
#define MPU6500_EXT_SENS_DATA_05    ((UINT8)0x4E)
#define MPU6500_EXT_SENS_DATA_06    ((UINT8)0x4F)
#define MPU6500_EXT_SENS_DATA_07    ((UINT8)0x50)
#define MPU6500_EXT_SENS_DATA_08    ((UINT8)0x51)
#define MPU6500_EXT_SENS_DATA_09    ((UINT8)0x52)
#define MPU6500_EXT_SENS_DATA_10    ((UINT8)0x53)
#define MPU6500_EXT_SENS_DATA_11    ((UINT8)0x54)
#define MPU6500_EXT_SENS_DATA_12    ((UINT8)0x55)
#define MPU6500_EXT_SENS_DATA_13    ((UINT8)0x56)
#define MPU6500_EXT_SENS_DATA_14    ((UINT8)0x57)
#define MPU6500_EXT_SENS_DATA_15    ((UINT8)0x58)
#define MPU6500_EXT_SENS_DATA_16    ((UINT8)0x59)
#define MPU6500_EXT_SENS_DATA_17    ((UINT8)0x5A)
#define MPU6500_EXT_SENS_DATA_18    ((UINT8)0x5B)
#define MPU6500_EXT_SENS_DATA_19    ((UINT8)0x5C)
#define MPU6500_EXT_SENS_DATA_20    ((UINT8)0x5D)
#define MPU6500_EXT_SENS_DATA_21    ((UINT8)0x5E)
#define MPU6500_EXT_SENS_DATA_22    ((UINT8)0x5F)
#define MPU6500_EXT_SENS_DATA_23    ((UINT8)0x60)
#define MPU6500_I2C_SLV0_DO         ((UINT8)0x63)
#define MPU6500_I2C_SLV1_DO         ((UINT8)0x64)
#define MPU6500_I2C_SLV2_DO         ((UINT8)0x65)
#define MPU6500_I2C_SLV3_DO         ((UINT8)0x66)
#define MPU6500_I2C_MST_DELAY_CTRL  ((UINT8)0x67)
#define MPU6500_SIGNAL_PATH_RESET   ((UINT8)0x68)
#define MPU6500_MOT_DETECT_CTRL     ((UINT8)0x69)
#define MPU6500_USER_CTRL           ((UINT8)0x6A)
#define MPU6500_PWR_MGMT_1          ((UINT8)0x6B)
#define MPU6500_PWR_MGMT_2          ((UINT8)0x6C)
#define MPU6500_FIFO_COUNTH         ((UINT8)0x72)
#define MPU6500_FIFO_COUNTL         ((UINT8)0x73)
#define MPU6500_FIFO_R_W            ((UINT8)0x74)
#define MPU6500_WHO_AM_I            ((UINT8)0x75)   /* ID = 0x71 In MPU9250 */
#define MPU6500_XA_OFFSET_H         ((UINT8)0x77)
#define MPU6500_XA_OFFSET_L         ((UINT8)0x78)
#define MPU6500_YA_OFFSET_H         ((UINT8)0x7A)
#define MPU6500_YA_OFFSET_L         ((UINT8)0x7B)
#define MPU6500_ZA_OFFSET_H         ((UINT8)0x7D)
#define MPU6500_ZA_OFFSET_L         ((UINT8)0x7E)

#define MPU6500_I2C_SLVx_EN         ((UINT8)0x80)
#define MPU6500_I2C_SLV4_DONE       ((UINT8)0x40)
#define MPU6500_I2C_SLV4_NACK       ((UINT8)0x10)


/* ---- AK8963 Reg In MPU9250 ----------------------------------------------- */

#define AK8963_I2C_ADDR             ((UINT8)0x0C)   /* 7b'0001100 */
#define AK8963_DeviceID             ((UINT8)0x48)

/* Read-only Reg */
#define AK8963_WIA                  ((UINT8)0x00)
#define AK8963_INFO                 ((UINT8)0x01)
#define AK8963_ST1                  ((UINT8)0x02)
#define AK8963_HXL                  ((UINT8)0x03)
#define AK8963_HXH                  ((UINT8)0x04)
#define AK8963_HYL                  ((UINT8)0x05)
#define AK8963_HYH                  ((UINT8)0x06)
#define AK8963_HZL                  ((UINT8)0x07)
#define AK8963_HZH                  ((UINT8)0x08)
#define AK8963_ST2                  ((UINT8)0x09)

/* Write/Read Reg */
#define AK8963_CNTL1                ((UINT8)0x0A)
#define AK8963_CNTL2                ((UINT8)0x0B)
#define AK8963_ASTC                 ((UINT8)0x0C)
#define AK8963_TS1                  ((UINT8)0x0D)
#define AK8963_TS2                  ((UINT8)0x0E)
#define AK8963_I2CDIS               ((UINT8)0x0F)

/* Read-only Reg ( ROM ) */
#define AK8963_ASAX                 ((UINT8)0x10)
#define AK8963_ASAY                 ((UINT8)0x11)
#define AK8963_ASAZ                 ((UINT8)0x12)

/* Status */
#define AK8963_STATUS_DRDY          ((UINT8)0x01)
#define AK8963_STATUS_DOR           ((UINT8)0x02)
#define AK8963_STATUS_HOFL          ((UINT8)0x08)

#endif
